<?php
namespace Admin\Controller;
/*
 *权限表控制器
 *田昭鹏
 *
 */
class RbacController extends CommonController {
	//构造函数
	public function __init() {
		// 继承父级构造函数
		parent::__init();
	}


// 页面————————————————————————————————————————————————————————————————————

		//管理员———————————————————— 

	// 管理员列表  index页面
	public function index() {
		// 实例化管理员表
		$auser = new \Common\Model\Auser;
		// 获取所有管理员信息
		$adminData = $auser -> get();
		// p($adminData);die;
		View::with('adminData', $adminData);

		View::make();
	}

	// 添加管理员方法  adduser页面
	public function addauser() {
		// 判断post提交
		if (IS_POST) {
			// 实例化管理员表
			$auser = new \Common\Model\Auser;
			// 跳转方法
			$result = $auser -> store();
			if (!$result) {
				// 返回状态status是否成功
				echo json_encode(array('status' => FALSE, 'message' => $auser -> getError()));
				die ;
			} else {
				echo json_encode(array('status' => TRUE, 'message' => '添加成功'));
				die ;
			}

		}

		View::make();
	}

	// 添加权限方法  authority页面
	public function authority(){
		// 判断提交
		if(IS_POST){
			// 跳添加方法
			$result=$this->addAuthority();
			if($result){
				echo json_encode(array('status' => TRUE, 'message' => '添加权限成功'));
				die;
			}else{
				echo json_encode(array('status' => FALSE, 'message' => '添加权限失败'));
				die;
			}
		}
		// 获取当前管理员
		$userData=current(Db::table('auser')->where('aid',Q('get.aid'))->get());
		View::with('userData',$userData);
		// var_dump($userData);

		// 获取当前管理员的角色信息
		// p(Q('get.aid'));
		$userRole=Db::table('user_role')->where('user_id',Q('get.aid'))->get();
		// p($userRole);
		$role_id=array();
		foreach ($userRole as $k => $v) {
			$role_id[]=$v['role_id'];
		}
		// p($role_id);
		View::with('role_id',$role_id);

		// 获取角色表信息
		$roleData=Db::table('role')->get();

		// p($roleData);die;
		View::with('roleData',$roleData);

		View::make();
	}

	// 删除管理员方法  auser表  user_role表
	public function deluser(){
		$aid=Q('get.aid');
		// 删除auser表
		Db::table('auser')->where('aid',$aid)->delete();

		// 删除user_role表
		Db::table('user_role')->where('user_id',$aid)->delete();

		View::success('删除成功');
	}

		//角色———————————————————— 

	// 添加角色方法  addrole页面
	public function addrole(){
		if(IS_POST){
			// 跳添加方法
			$result=$this->addRoleNode();
			if($result){
				echo json_encode(array('status' => TRUE, 'message' => '添加角色成功'));
				die;
			}else{
				echo json_encode(array('status' => FALSE, 'message' => '添加角色失败'));
				die;
			}
		}
		// 获取所有节点信息
		$nodeData=Data::tree(Db::table('node')->get(),'name','id');
		View::with('nodeData',$nodeData);
		// p($nodeData);die;
		View::make();
	}

	// 编辑角色方法   editrole页面
	public function editrole(){
		// 判断提交
		if(IS_POST){
			// 跳编辑方法
			$result=$this->editroleSon();
			if($result){
				echo json_encode(array('status' => TRUE, 'message' => '编辑角色成功'));
				die;
			}else{
				echo json_encode(array('status' => FALSE, 'message' => '编辑角色失败'));
				die;
			}
		}

		// 获取据角色信息
		$roleData=current(Db::table('role')->where('id',Q('get.rid'))->get());
		// p($roleData);
		View::with('roleData',$roleData);

		// 获取角色原有节点信息
		$oldNid=Db::table('access')->where('role_id',Q('get.rid'))->get();
		$nids=array();
		foreach ($oldNid as $k => $v) {
			$nids[]=$v['node_id'];
		}
		View::with('nids',$nids);
		// p($nids);

		// 获取所有节点信息
		$nodeData=Data::tree(Db::table('node')->get(),'name','id');
		View::with('nodeData',$nodeData);

		View::make();
	}

	// 删除角色的方法  access表  user_role表  role表
	public function delrole(){
		// p(Q('get.rid'));
		$rid=Q('get.rid');
		// 先删除role表
		Db::table('role')->where('id',$rid)->delete();

		// 删除user_role表
		Db::table('user_role')->where('role_id',$rid)->delete();

		// 删除access表
		Db::table('access')->where('role_id',$rid)->delete();

		View::success('删除成功');
	}






		//节点———————————————————— 
	
	// 节点列表页面
	public function node(){
		// 获取所有节点信息
		$nodeData=Data::tree(Db::table('node')->get(),'name','id');
		View::with('nodeData',$nodeData);

		View::make();
	}

	// 添加节点方法
	public function addnode(){
		if(IS_POST){
			// 跳添加方法
			$result=$this->addnodeSon();
			if($result){
				echo json_encode(array('status' => TRUE, 'message' => '添加节点成功'));
				die;
			}else{
				echo json_encode(array('status' => FALSE, 'message' => '添加节点失败'));
				die;
			}
		}
		$title=Db::table('node')->where('id',Q('get.pid'))->pluck('name');
		View::with('title',$title);
		// p($title);

		View::make();
	}

	// 删除节点方法
	public function delnode(){
		// 先判断该节点是否有子集
		$nid=Q('get.nid');
		// p($nid);die;
		$result=Db::table('node')->where('pid',$nid)->get();
		// p($result);die;
		if($result){
			View::success('该节点存在子节点！请先删除子节点',U('node'));
		}
		// 先删除节点表 node
		Db::table('node')->where('id',$nid)->delete();

		// 删除中间表  access
		Db::table('access')->where('node_id',$nid)->delete();

		View::success('删除成功',U('node'));
	}

	// 编辑节点方法
	public function editnode(){
		// 判断提交
		if(IS_POST){
			// 修改数据库
			$result=Db::table('node')->where('id',Q('post.nid'))->update(array('name'=>Q('post.name'),'title'=>Q('post.title'),'sort'=>Q('post.sort')));
			// 判断返回值
			if($result){
				echo json_encode(array('status' => TRUE, 'message' => '编辑节点成功'));
				die;
			}else{
				echo json_encode(array('status' => FALSE, 'message' => '编辑节点失败'));
				die;
			}
		}
		
		$nid=Q('get.nid');
		$nodeData=current(Db::table('node')->where('id',$nid)->get());
		// p($nodeData);
		View::with('nodeData',$nodeData);

		View::make();
	}

// ajax方法——————————————————————————————————————————————————————————————
	// 判断角色是否存在
	public function ajaxName(){
		// 进数据库比对
		$data=Db::table('role')->where('name',Q('post.name'))->get();
		// p($data);
		if($data){
			$arr=array('status'=>false,'message'=>'角色名已存在');
		}else{
			$arr=array('status'=>true,'message'=>'可以添加');
		}
		View::ajax($arr);
	}



// 控制器方法————————————————————————————————————————————————————————————————————————————————————————————
	// 添加角色的方法
	private function addRoleNode(){
		// 实例化角色表
		$role=new \Common\Model\Role;
		// 先添加角色表  返回角色id
		$rid=$role->add(array('name'=>Q('post.name'),'status'=>1));
		// p($rid);
		
		// 获取要添加的节点id
		$nids=array();
		$node=Db::table('node')->get();
		// 去node表找父级
		foreach (Q('post.level3') as $k => $v) {
			$nids=array_merge($nids,$this->getFather($node,$v));
		}
		// 去掉重复的元素
		$nids=array_unique($nids);
		// p($nids);die;
		// 声明空数组
		$temp=array();
		foreach ($nids as $k => $v) {
			$temp['role_id']=$rid;
			$temp['node_id']=$v;
			Db::table('access')->insert($temp);
		}

		return TRUE;
	}


	// 找节点父级的方法
	private function getFather($data,$nid){
		// 声明数组  防止报错
        $temp=array();
        // 循环添加数组元素
        foreach ($data as $v) {
            // 判断子集
            if($nid==$v['id']){
                // 压入数组
                $temp[]=$v['id'];
                // 合并数组
                $temp=array_merge($this->getFather($data, $v['pid']),$temp);
            }
        }
        // 返回数组
        return $temp;
	}


	// 给管理员添加权限的方法
	private function addAuthority(){
		// p($_POST);die;
		$user_id=Q('post.aid');
		// p($user_id);die;
		// 先删除原有角色
		$result=Db::table('user_role')->where('user_id',$user_id)->delete();
		if(!$result) return FALSE;
		// 声明空数组
		$temp=array();
		// 添加user_role表
		foreach (Q('post.id') as $k => $v) {
			$temp['user_id']=$user_id;
			$temp['role_id']=$v;
			// p($temp);die;
			Db::table('user_role')->insert($temp);
		}
		return TRUE;
	}


	// 编辑角色提交到数据库的方法
	private function editroleSon(){
		// 1.先修改角色表
		$result=Db::table('role')->where('id',Q('post.rid'))->update(array('name'=>Q('post.name')));
		if(!$result) return FALSE;

		// 2.删除中间表
		$result=Db::table('access')->where('role_id',Q('post.rid'))->delete();
		if(!$result) return FALSE;

		// 3.添加中间表
		// 获取要添加的节点id
		$nids=array();
		$node=Db::table('node')->get();
		// 去node表找父级
		foreach (Q('post.level3') as $k => $v) {
			$nids=array_merge($nids,$this->getFather($node,$v));
		}
		// 去掉重复的元素
		$nids=array_unique($nids);
		// p($nids);die;
		// 声明空数组
		$temp=array();
		foreach ($nids as $k => $v) {
			$temp['role_id']=Q('post.rid');
			$temp['node_id']=$v;
			Db::table('access')->insert($temp);
		}
		return TRUE;
	}

	// 添加节点子方法
	private function addnodeSon(){
		$data=Q('post.');
		$data['level']=Q('post.level',0,'intval')+1;
		// p($data);
		Db::table('node')->insert($data);
		return TRUE;
	}

}
